<?php
/**
 * シンプルテスト（ＵＮＩＴＴＥＳＴ）
 */
/*
evernote:///view/9639069/s89/d652f978-07d0-4c1e-a60f-b61470e6b550/d652f978-07d0-4c1e-a60f-b61470e6b550/
 */
require_once dirname(__FILE__) . '/Components.php';
require_once dirname(__FILE__) . '/anchor.php';


/**
 * シンプルテスト結果表示クラス
 */
class Smarty_Components_Simpletest extends Smarty_Components
{
	/** テンプレートファイル名 */
	const FILE_NAME_TEMPLATE = 'simpletest.tpl';
	/** 評価ファイル名 */
	const FILE_BASE_TEST_HTML = '.html';
	/** 目次ファイル名 */
	const FILE_BASE_NAME_INDEX_HTML = '_index.html';
	/** ログファイル名 */
	const FILE_BASE_NAME_TEST_LOG = '_testlog.txt';
	/** ログセパレータ */
	const DELIMITER = '-';

	/** @var タイトル */
	public $TITLE;
	/** @var コンテンツ */
	public $CONTENTS;

	/** @var ファイルプレフィックス */
	protected $_sPrefixFileName;
	/** @var 評価ファイルパス */
	protected $_sSavePath;
	/** @var テストクラス名 */
	protected $_sTestClassName;
	/** @var テストメソッド名 */
	protected $_sTestMethodName;
	/** @var 日時 */
	protected $_sDateTime;

	/**
	 * コンストラクタ
	 * @param $sCompileDir
	 * ＠param $sPathTestResult
	 * @param $sContents 評価ソースコード
	 * @param $sTestClassName 評価テストクラス名
	 * @param $sTestMethodName 評価テストメソッド名
	 */
	public function __construct($sCompileDir, $sPathTestResult, $sContents, $sTestClassName, $sTestMethodName)
	{
		parent::__construct(dirname(__FILE__), $sCompileDir, '');
		$this->_sSavePath = $sPathTestResult;
		$this->CONTENTS = $sContents;
		$this->_sPrefixFileName = $sTestClassName.'_'.$sTestMethodName;
		$this->_sTestClassName = $sTestClassName;
		$this->_sTestMethodName = $sTestMethodName;
		$this->_sDateTime = date('YmdHis');
	}

	/**
	 * 評価ＨＴＭＬ作成
	 */
	protected function _mkTestResultHtml()
	{
		$this->view->TILTE = $this->_sTestClassName.'::'.$this->_sTestMethodName;
		$this->view->CONTENTS = $this->CONTENTS;
		$sHtml = parent::fetch(self::FILE_NAME_TEMPLATE);
		file_put_contents(
				$this->_getHtmlFileName(),
				$this->CONTENTS
				);
	}

	/**
	 * ログファイル作成
	 */
	protected function _mkLog()
	{
		$sContents = $this->_sDateTime . self::DELIMITER . $this->_getHtmlFileName(). "\r\n";
		file_put_contents($this->_getLogFileName(), $sContents, FILE_APPEND);
	}

	/**
	 * 目次ファイル作成
	 */
	protected function _mkIndex()
	{
		$sLogData = file_get_contents($this->_getLogFileName());
		$sContents = "";
		/***
		 * ログファイル走査
		 */
		foreach ($sLogData as $sLogRec) {
			/*** 改行タグ挿入 */
			if ( $sContents != '' ) {
				$sContents .= '<br />'."\r\n";
			}
			$sAnchor = $this->_getIndexAnchor($sLogRec);
			/*** アンカー先があれば設定する */
			if ( $sAnchor !== FALSE ) {
				$sContents .= $sAnchor;
			}
		}
		file_put_contents($this->_getIndexFileName(), $sContents);
	}

	/**
	 * もくじ用アンカータグを返す
	 * 参照先がない場合、ＦＡＬＳＥを返す
	 * @param unknown_type $sHref
	 */
	protected function _getIndexAnchor($sLogRec)
	{
		$aryDivide = explode(self::DELIMITER, $sLogRec);

		/*** 参照先がない場合ＦＡＬＳＥを返す */
		if ( !file_exists($aryDivide[1])) {
			return FALSE;
		}

		$objSmartyAnchor
		= new Smarty_Components_Anchor(
				$this->smarty->compile_dir, '', $aryDivide[1], $sLogRec);

		$sHtml = $objSmartyAnchor->fetch();
		return $sHtml;
	}

	/**
	 * 評価用ＨＴＭＬファイル名を返す
	 * @return string
	 */
	protected function _getHtmlFileName()
	{
		$sResult = $this->_sSavePath . $this->_sPrefixFileName.self::FILE_BASE_TEST_HTML;
		return $sResult;
	}

	/**
	 * ログファイル名を返す
	 */
	protected function _getLogFileName()
	{
		$sResult = $this->_sSavePath . $this->_sTestClassName . self::FILE_BASE_NAME_TEST_LOG;
		return $sResult;
	}

	/**
	 * もくじＨＴＭＬファイル名を返す
	 */
	protected function _getIndexFileName()
	{
		$sResult = $this->_sSavePath . $this->_sTestClassName . self::FILE_BASE_NAME_INDEX_HTML;
		return $sResult;
	}
}